package org.xmap.storage;
import java.io.*;
import org.xmap.util.ByteOrder;
/**
 * <p>Description: 简单输入流，可以设置流的方式为大尾或小尾。</p>
 * @author Zealot
 * @version 1.0
 */
public final class SimpleInputStream {
    /**
     * 输入流。
     */
    private DataInputStream dis;
    /**
     * 读取模式，可以为大尾或小尾。
     */
    private boolean mode;
    /**
     * 指定输入流的构造函数。
     * @param is InputStream 输入流。
     */
    public SimpleInputStream(InputStream is) {
        this.dis = new DataInputStream(is);
        this.mode = ByteOrder.BIG_ENDIAN; // 默认为大尾，网络字节序
    }
    /**
     * 设置字节序。
     * @param mode boolean true为大尾，网络字节序，false为小尾。
     */
    public void setMode(boolean mode) {
        this.mode = mode;
    }
    /**
     * 重置输入流，一般只有在内存中的流才可以重置。
     * @throws IOException io异常。
     */
    public void reset() throws IOException {
        this.dis.reset();
    }
    /**
     * 跳过指定数量个字节。
     * @param count long 指定数量。
     * @throws IOException io异常。
     */
    public void skip(long count) throws IOException {
        this.dis.skip(count);
    }
    /**
     * 读取一个字节。
     * @return int 从流中读取的数值。
     * @throws IOException io异常。
     */
    public int read() throws IOException {
        return this.dis.read();
    }
    /**
     * 读取一个短整形数。
     * @return short 从流中读取的数值。
     * @throws IOException io异常。
     */
    public short readShort() throws IOException {
        short value = this.dis.readShort();
        if (this.mode) {
            return value;
        } else {
            return ByteOrder.convert(value);
        }
    }
    /**
     * 读取一个整形数。
     * @return int 从流中读取的数值。
     * @throws IOException io异常。
     */
    public int readInt() throws IOException {
        int value = this.dis.readInt();
        if (this.mode) {
            return value;
        } else {
            return ByteOrder.convert(value);
        }
    }
    /**
     * 读取一个长整形。
     * @return long 从流中读取的数值。
     * @throws IOException io异常。
     */
    public long readLong() throws IOException {
        long value = this.dis.readLong();
        if (this.mode) {
            return value;
        } else {
            return ByteOrder.convert(value);
        }
    }
    /**
     * 从流中填满数据到指定数组。
     * @param data byte[] 指定数组。
     * @throws IOException io异常。
     */
    public void readFully(byte[] data) throws IOException {
        this.dis.readFully(data, 0, data.length);
    }
}
